import logging
import os
from logging.handlers import RotatingFileHandler
from datetime import datetime
from flask import request

app = None  # 全局变量，将在setup_logger中设置

# 日志记录器字典
loggers = {}

def setup_logger(flask_app):
    """配置应用日志系统"""
    global app
    app = flask_app
    
    # 确保日志目录存在
    if not os.path.exists('logs'):
        os.mkdir('logs')
    
    # 配置日志格式
    log_format = '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
    formatter = logging.Formatter(log_format)
    
    # 配置文件日志处理器 - 按日期和大小轮转
    file_handler = RotatingFileHandler(
        f'logs/oa_system_{datetime.now().strftime("%Y%m%d")}.log', 
        maxBytes=10240000,  # 10MB
        backupCount=10
    )
    file_handler.setFormatter(formatter)
    file_handler.setLevel(logging.INFO)
    
    # 配置错误日志处理器
    error_handler = RotatingFileHandler(
        f'logs/oa_system_errors_{datetime.now().strftime("%Y%m%d")}.log', 
        maxBytes=10240000,  # 10MB
        backupCount=10
    )
    error_handler.setFormatter(formatter)
    error_handler.setLevel(logging.ERROR)
    
    # 配置控制台日志处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    console_handler.setLevel(logging.DEBUG if app.debug else logging.INFO)
    
    # 添加处理器到应用日志
    app.logger.addHandler(file_handler)
    app.logger.addHandler(error_handler)
    app.logger.addHandler(console_handler)
    
    # 设置日志级别
    app.logger.setLevel(logging.DEBUG if app.debug else logging.INFO)
    app.logger.info('OA系统日志系统初始化完成')
    
    return app.logger

def get_logger(name='app'):
    """获取指定名称的日志记录器"""
    if name in loggers:
        return loggers[name]
    
    # 创建新的日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(logging.INFO)
    
    # 如果应用已初始化，添加相同的处理器
    if app:
        # 避免重复添加处理器
        if not logger.handlers:
            # 配置日志格式
            log_format = '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
            formatter = logging.Formatter(log_format)
            
            # 文件处理器 - 轮转日志
            file_handler = RotatingFileHandler(
                f'logs/{name}_{datetime.now().strftime("%Y%m%d")}.log', 
                maxBytes=10240000,  # 10MB
                backupCount=10
            )
            file_handler.setFormatter(formatter)
            file_handler.setLevel(logging.INFO)
            logger.addHandler(file_handler)
            
            # 错误日志处理器
            error_handler = RotatingFileHandler(
                f'logs/{name}_errors_{datetime.now().strftime("%Y%m%d")}.log', 
                maxBytes=10240000,  # 10MB
                backupCount=10
            )
            error_handler.setFormatter(formatter)
            error_handler.setLevel(logging.ERROR)
            logger.addHandler(error_handler)
    
    # 将日志记录器添加到字典
    loggers[name] = logger
    
    return logger

def log_request_info(request_obj):
    """记录请求信息"""
    if not app:
        return
        
    app.logger.debug(f"请求路径: {request_obj.path}")
    app.logger.debug(f"请求方法: {request_obj.method}")
    app.logger.debug(f"请求参数: {dict(request_obj.args)}")
    if request_obj.is_json:
        app.logger.debug(f"请求数据: {request_obj.get_json()}")
    elif request_obj.form:
        app.logger.debug(f"表单数据: {dict(request_obj.form)}")

def log_response_info(response):
    """记录响应信息"""
    if not app:
        return
        
    app.logger.debug(f"响应状态码: {response.status_code}")
    try:
        # 检查response是否有data属性并且可以安全访问
        if hasattr(response, 'data') and response.data:
            try:
                import json
                data = json.loads(response.data.decode('utf8'))
                # 只记录部分响应数据，避免日志过大
                if isinstance(data, dict):
                    log_data = {k: v for k, v in data.items() if k not in ['data', 'items', 'list']}
                    app.logger.debug(f"响应数据: {log_data}")
            except:
                pass
    except RuntimeError:
        # 处理response处于直接传递模式的情况
        app.logger.debug("响应处于直接传递模式，无法记录响应数据")
    except Exception as e:
        # 处理其他可能的异常
        app.logger.debug(f"记录响应数据时出错: {str(e)}")

def log_exception_info(exception, traceback_str=None):
    """记录异常信息"""
    if not app:
        return
        
    app.logger.error(f"异常类型: {type(exception).__name__}")
    app.logger.error(f"异常信息: {str(exception)}")
    if traceback_str:
        app.logger.error(f"异常堆栈: {traceback_str}")